#include<stdio.h>

#define Min(a,b) (a) < (b) ? (a) : (b)

int MyStrlen(const char *s)
{
    int count = 0;
    while(*s != '\0')
    {
        count ++;
        s++;
    }
    return count;
}

int MyStrcmp(const char *s1,const char *s2)
{
    while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
    {
        s1++;
        s2++;
    }
    // 不相等出循环 或者到\0
    return *s1 - *s2;
}

int MyStrncmp(const char *s1,const char *s2,int n)
{
    //比较的长度 n
    n = Min(Min(MyStrlen(s1),MyStrlen(s2)),n);  //取三者的最小值
    while(*s1 == *s2 && n != 1)  //  n != 1 : 留下最后一个字母做比较 
    {
        s1++;
        s2++;
        n--;
    }
    return *s1 - *s2;
}

void MyStrcpy(char *dest,const char *src)
{
    while(*src != '\0')
        *dest++ = *src++;  //一个字母一个字母拷贝
    *dest = '\0';  //手动尾部添加'\0'
}

void MyStrncpy(char *dest,const char *src,int n)
{
    while(n-- != 0)
    {
        *dest++ = *src++;
    }
    *dest = '\0';
}

void MyStrcat(char *dest,const char *src)
{
    MyStrcpy(dest+MyStrlen(dest),src);
}

void MyStrncat(char *dest,const char *src,int n)
{
    MyStrncpy(dest+MyStrlen(dest),src,n);
}

const char * MyStrstr(const char *dest,const char *src)
{
    //滑动窗口算法
    int lenDest = MyStrlen(dest);
    int lenSrc = MyStrlen(src);

    for(int i = 0;i <= lenDest - lenSrc;i++)
    {
        if(MyStrncmp(dest+i,src,lenSrc) == 0)
        {
            return dest + i;
        }
    }
    return NULL;
}

char* MyStrtok(char *src,const char *delim)
{
    //上一次切割完的下一个字符串的首地址
    static char *nextStr = NULL;
    if(src == NULL) // 想继续切割上一次的字符串
        src = nextStr;
    if(src == NULL)  //上次的字符串已经切割完了
        return NULL;

    //跳过所有的分隔符
    while(*src != '\0')
    {
        //判断当前字符是否是分隔符
        char tmp[] = {*src,'\0'};
        if(MyStrstr(delim,tmp))  //当前字符是分隔符
        {
            src++;
        }
        else 
        {
            break;  //找到非分割符的有效字符，结束循环
        }
    }
    if(*src == '\0')  // 字符串结束没有有效字符
        return NULL;

    // src 就是下一个有效字符串的首地址
    char *end = src;  
    //继续找下一个分隔符
    while(*end != '\0')
    {
        //判断当前字符是否是分隔符
        char tmp[] = {*end,'\0'};
        if(MyStrstr(delim,tmp))  //当前字符是分隔符
        {
            break;
        }
        else 
        {
            end++;  //继续找下一个有效字符
        }
    }
    if(*end == '\0') //字符串结束了
    {
        nextStr = NULL;  //没有下一个要切割的字符串
    }
    else
    {
        *end = '\0'; //
        nextStr = end + 1;
    }
    return src;
}

int main()
{
    // char s1[] = "hello";
    // char s2[6] = {0};
    // MyStrncpy(s2,s1,4);
    // printf("%s\n",s2);

    // char s1[20] = "hello ";
    // char s2[7] = "world!";
    // MyStrncat(s1,s2,2);
    // printf("%s\n",s1);

    // char s1[] = "helloworld";
    // char s2[] = "ello";
    // char *dest = MyStrstr(s1,s2);
    // if(dest)  //dest不为空
    // {
    //     printf("%s\n",dest);
    // }
    // else 
    // {
    //     printf("没找到！\n");
    // }

   char s[] = "zhangsan,lisi.wangwu/laoliu,wuhao";
    char *p = MyStrtok(s,",.");
    while(p!=NULL)
    {
        printf("%s\n",p);
        p = MyStrtok(NULL,",./");
    }


    return 0;
}
